From aee620eaaa9225200e52d72934159545f256c76e Mon Sep 17 00:00:00 2001 From: oliskoli Date: Sat, 25 Aug 2007 20:20:29 +0000 Subject: [PATCH] nmea: Fix memory leaks (detected with reference/tracks/nmea+ms.txt). --- nmea.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/nmea.c b/nmea.c index a565da7a7..f9ea6d2ef 100644 --- a/nmea.c +++ b/nmea.c @@ -232,6 +232,17 @@ nmea_add_wpt(waypoint *wpt, route_head *trk) else waypt_add(wpt); } +static void +nmea_release_wpt(waypoint *wpt) +{ + if (wpt && ((wpt->Q.next == NULL) || (wpt->Q.next == &wpt->Q))) { + /* This waypoint isn't queued. + Release it, because we don't have any reference to this + waypoint (! memory leak !) */ + waypt_free(wpt); + } +} + static void nmea_rd_init(const char *fname) { @@ -389,9 +400,7 @@ gpgll_parse(char *ibuf) if (lngdir == 'W') lngdeg = -lngdeg; waypt->longitude = ddmm2degrees(lngdeg); - if (curr_waypt && (read_mode == rm_serial)) { - waypt_free(curr_waypt); - } + nmea_release_wpt(curr_waypt); curr_waypt = waypt; } @@ -468,9 +477,7 @@ gpgga_parse(char *ibuf) break; } - if (curr_waypt && (read_mode == rm_serial)) { - waypt_free(curr_waypt); - } + nmea_release_wpt(curr_waypt); curr_waypt = waypt; } @@ -544,9 +551,7 @@ gprmc_parse(char *ibuf) if (lngdir == 'W') lngdeg = -lngdeg; waypt->longitude = ddmm2degrees(lngdeg); - if (curr_waypt && (read_mode == rm_serial)) { - waypt_free(curr_waypt); - } + nmea_release_wpt(curr_waypt); curr_waypt = waypt; } -- 2.30.2